package com.battery.system.service.battery;

import com.alibaba.fastjson.JSONObject;
import com.alipay.api.response.AlipayFundAuthOperationDetailQueryResponse;
import com.battery.common.core.domain.AjaxResult;
import com.battery.common.utils.BatteryJSONResult;
import com.battery.common.utils.ali.AliPayEntity;
import com.battery.system.domain.AppUser;
import com.battery.system.domain.AuthUsed;
import com.battery.system.domain.BO.UsedBO;
import com.battery.system.domain.Device;
import com.battery.system.domain.StoreInstall;
import com.battery.system.domain.VO.UsedVO;
import com.battery.system.service.IBaseService;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 租借授权Service接口
 *
 * @author battery
 * @date 2021-01-22
 */
public interface IAuthUsedService extends IBaseService<AuthUsed> {
    /**
     * 查询租借授权
     *
     * @param usedId 租借授权ID
     * @return 租借授权
     */
    public AuthUsed selectAuthUsedById(String usedId);

    /**
     * 查询租借授权列表
     *
     * @param authUsed 租借授权
     * @return 租借授权集合
     */
    public List<AuthUsed> selectAuthUsedList(AuthUsed authUsed);

    /**
     * 新增租借授权
     *
     * @param authUsed 租借授权
     * @return 结果
     */
    public int insertAuthUsed(AuthUsed authUsed);

    /**
     * 修改租借授权
     *
     * @param authUsed 租借授权
     * @return 结果
     */
    public int updateAuthUsed(AuthUsed authUsed);

    /**
     * 批量删除租借授权
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    public int deleteAuthUsedByIds(String ids);

    /**
     * 删除租借授权信息
     *
     * @param usedId 租借授权ID
     * @return 结果
     */
    public int deleteAuthUsedById(String usedId);

    /**
     * 创建微信支付分订单
     *
     * @param appUser      租借用户
     * @param device       设备
     * @param storeInstall 门店配置信息
     * @param amount       金额
     * @return
     */
    BatteryJSONResult createrentbill(AppUser appUser, Device device, StoreInstall storeInstall, BigDecimal amount);

    /**
     * 根据商户服务订单号获取对应的授权单子
     *
     * @param out_order_no
     * @return
     */
    AuthUsed selectByOutOrderNo(String out_order_no);

    /**
     * 租借失败，更新租借失败状态，同时撤销微信支付分订单
     *
     * @param used_id
     * @return
     */
    BatteryJSONResult doWxRevokeOrder(String used_id);

    /**
     * 查询用户是否点击确认
     *
     * @param authUsed
     * @param isOutOrderNo
     * @return
     */
    BatteryJSONResult queryrentbill(AuthUsed authUsed, boolean isOutOrderNo);


    /**
     * 微信支付分零元结束订单
     *
     * @param authUsed
     * @return
     */
    int wxfreeZeroPay(AuthUsed authUsed);


    /**
     * 微信支付分支付成功回调通知
     *
     * @param collectionJSON 收款信息，非0元完结后返回
     * @param authUsed       微信支付分授权订单
     * @return
     */
    int wxfreePay(JSONObject collectionJSON, AuthUsed authUsed);

    /**
     * 支付宝创建预授权订单
     *
     * @param appUser      用户信息
     * @param device       设备信息
     * @param storeInstall 门店配置信息
     * @param amount       冻结金额
     * @param entity       授权参数
     * @return
     */
    BatteryJSONResult doFreeze(AppUser appUser, Device device, StoreInstall storeInstall, BigDecimal amount, AliPayEntity entity);


    /**
     * 支付宝预授权订单解冻，同时更新租借状态
     *
     * @param used_id
     * @param entity
     * @return
     */
    BatteryJSONResult doUnfreeze(String used_id, AliPayEntity entity);

    /**
     * 支付宝预授权-授权回调通知
     *
     * @param authUsed 授权订单
     * @param response
     * @return
     */
    String freezeCallback(AuthUsed authUsed, AlipayFundAuthOperationDetailQueryResponse response);

    /**
     * 微信免押订单列表
     *
     * @param usedBO
     * @return
     */
    List<UsedVO> wxAuthList(UsedBO usedBO);

    /**
     * 微信支付分发起支付，催款
     *
     * @param id 租借记录ID
     * @return
     */
    AjaxResult requestWxFreePay(String id);

    /**
     * 支付宝免押订单列表
     *
     * @param usedBO
     * @return
     */
    List<UsedVO> aliAuthList(UsedBO usedBO);

    /**
     * 支付宝预授权发起催款
     *
     * @param used_id
     * @return
     */
    AjaxResult requestAliFreePay(String used_id, AliPayEntity entity);

    /**
     * 查询该用户发起免押租借但是未确认的订单数
     *
     * @param appUserId
     * @param lastMonth
     * @return
     */
    Integer selectCountNoAuth(String appUserId, Date lastMonth);
}
